﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ArgosMembership.Modelo;
using ArgosMembership.Componentes;
using ArgosMembership.Enums;

namespace ArgosMembership.Componentes
{
    public class Seguridad
    {
        private const string AllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        private const string SimpleAllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        /// <summary>
        /// Se obtiene la cuenta del usuario y se valida
        /// </summary>
        /// <param name="user">cuenta a validar</param>
        /// <param name="password">password para validar</param>
        /// <returns></returns>
        public static Usuario ValidarUsuario(string user, string password)
        {
            string hashPassword = string.Empty;
            hashPassword = Encripcion.Encripta(user + "|" + password);
            
            Usuario usuario = null;
            try
            {
                usuario = AdministradorUsuario.Obtener(user);

                if (usuario != null)
                {
                    //Validar la contraseña
                    if (!Encripcion.HashVerificar(password, usuario.Password))
                        throw new SMException("Usuario o contraseña incorrectos");
                }
                else 
                    throw new SMException("Usted no tiene privilegios para entrar al sistema");

            }
            finally
            {
               
            }
            return usuario;
        }

        public static bool ResetearPassword(string correo,  ref string passwordNuevo)
        {
            bool bolResultado = false;
            int intUsuarioId = 0;

            if (string.IsNullOrWhiteSpace(correo))
                throw new SMException("El correo es obligatorio");

            // obtener la información del usuario por su cuenta de correo
           
                intUsuarioId = AdministradorUsuario.ObtenerId(correo);

            if (intUsuarioId == 0)
                return bolResultado;

            // generar un password nuevo y actualizarlo al usuario
            passwordNuevo = CadenaAleatoria();
            bolResultado = CambiarPassword(intUsuarioId, passwordNuevo);

            //Indicador de si el password se pudo cambiar
            return bolResultado;

        }

        public static bool CambiarPassword(int usuarioId, string passwordNuevo)
        {

            bool bolResultado = false;

            if (usuarioId == 0)
                throw new SMException("El identificador del usuario es obligatorio");

            if (string.IsNullOrWhiteSpace(passwordNuevo))
                throw new SMException("El password nuevo es obligatorio");

            try
            {
                bolResultado = AdministradorUsuario.CambiaPassoword(usuarioId, passwordNuevo);
            }
            finally
            {

            }

            // regresar el resultado del proceso.
            return bolResultado;
        }

        public static bool TienePrivilegios(Privilegios permisos, Privilegios permiso)
        {
            if (permisos.HasFlag(permiso))
                return true;
            else
                return false;

            //if ((permisos & permiso) == permiso)
            //    return true;
            //else
            //    return false;
        }

        /// <summary>
        /// Genera una secuencia aleatoria de caracteres 
        /// </summary>
        /// <param name="length">Longitud de la cadena</param>
        /// <param name="useSimpleCharacterSet">Set de caracteres a utilizar (default)</param>
        /// <param name="additionalCharacters">Set adicional de catacteres a utilizar</param>
        /// <returns></returns>
        private static string CadenaAleatoria(int length, bool useSimpleCharacterSet = false, string additionalCharacters = "")
        {
            var random = new Random();

            var chars = new char[length];

            var charsToUse = useSimpleCharacterSet ? SimpleAllowableCharacters : AllowableCharacters;
            charsToUse = string.Format("{0}{1}", charsToUse, additionalCharacters);

            var allowableLength = charsToUse.Length;

            for (var i = 0; i < length; i++)
            {
                chars[i] = charsToUse[random.Next(allowableLength)];
            }

            return new string(chars);
        }

        /// <summary>
        /// Genera una cadena aleatoria, por defecto la longitud es de 15 caracteres
        /// </summary>
        /// <returns></returns>
        public static string CadenaAleatoria()
        {
            return CadenaAleatoria(10);
        }
    }
}
